<?php
include_once("funciones_kmeans.php");

 function initconsulta($k,$w,$urls)
	{
		//Cantidad de documentos.
		$max=count($w);
		//$centro = centros iniciales.
		$centro = array();
		$x = array();
		for($i=0;$i<$k;$i++)
		{
			//Inserta centros aleatorios en $centro.
			$temp = rand(0,$max-1);
			if(!in_array($temp, $x))
			{
				$x[$i] = $temp;
				$centro[]=$w[$x[$i]]; 
			}
			else
				$i--;
		}
		asignarGruposconsulta($centro,$w,$urls);
	}
	
	function asignarGruposconsulta($centros,$w,$urls)
	{
		//$grupos son los clusters que contienen los puntos, es decir, los docs.
		$grupos = array();
		//iniciliazar para un/cada centro asigna un array vacio.
		foreach($centros as $centroKey => $centro)
		{
			$grupos[$centroKey] = array();
		}
		//      $w          $i         $w[$i]
		foreach($w as $documentKey => $document)
		{
			//El minimo es el primer centro.
			$min=distance($document,$centros[0]);
			//El id del centro minimo actual.
			$minId=0;
			
			//Buscar el centro mas cercano al doc actual.
			foreach($centros as $centroKey => $centro)
			{
				$aux = distance($document,$centro);
				//echo $aux."<br>";
				if($aux<$min)
				{
					$minId=$centroKey;
					$min = $aux;
				}
			}
			//array_push pone un elemento al final del array.
			//Conexion entre un doc y su centro.
			array_push($grupos[$minId],$document);
/*
			echo $minId." ";
			foreach($document as $term){
					echo $term." ";
				}
			echo "<br>";
*/
		}
		$nuevosCentros = array();
		//Recalcula los centros de cada grupo.
		foreach($grupos as $grupo)
		{
			$nuevosCentros[]=recalcularCentro($grupo);
		}
/*
		echo "<br>Centros: <br>";
		print_r($centros);
		echo "<br>Nuevos Centro: <br>";
		print_r($nuevosCentros);
*/
		//Bandera de parada.
		$band=true;
		//Cantidad de centros (valores).
		$tam=count($nuevosCentros);
		//recorro los centros para ver si cambiaron.
		for($i=0;$i<$tam && $band ;$i++)
		{
			//veo si cambio de centro.
			//if($centros[$i] != $nuevosCentros[$i])
			if(distance($centros[$i], $nuevosCentros[$i])>0.1)
			{
				//echo distance($centros[$i], $nuevosCentros[$i])."<br>";
				$band=false;
				//echo $i;
			}
		}
		//si cambio, recalcular con los centros nuevos.
		if(!$band)
		{
			asignarGruposconsulta($nuevosCentros,$w,$urls);
		}
		else
		{
			//aqui empieza la vaina de la consulta
			
			$consulta=recalcularCentro($centros);
			//var_dump($consulta);
			$k=3;//numero de k-vecinos
			$vecinos=kvecinos($consulta, $grupos, $k, $w);
			//var_dump($vecinos);
			$clase=clconsulta($consulta, $vecinos, $grupos); //clasifico la consulta
			//var_dump($clase);
			$vecinos=kvecinosconsulta($consulta, $grupos[$clase], $k, $w);//lista de los resultados sin ordenar
			$listadocs=rnurl($vecinos,$w);
			//var_dump($listadocs);
			echo "<h3>Resultados de la consulta</h3>";
			for($i=0;$i<count($listadocs);$i++)
				echo $urls[$listadocs[$i]]."<br>";//si lo hago a lo tosco con un k grande
												  //y sin clasificar la consulta e imprimo la lista
			//si lo hago como creo que es
			metricas($w, $grupos, $centros);
			
			//imprimo la lista
		}	
	}
		
	function kvecinos($consulta, $groups, $k, $w)
	{
		$vecinos=array();
		$v=0;
		for($i=0;$i<count($w);$i++)
		{
			$distancias[$i]=distance($consulta, $w[$i]);
		}
		
		for($g=0;$g<count($groups);$g++)
		{
			$distmin=1000;
			for($d=0;$d<count($groups[$g]);$d++)
			{
				$dist=distance($consulta, $groups[$g][$d]);
				if(($dist<$distmin)&&(!in_array($groups[$g][$d], $vecinos)))
				{
					$distmin=$dist;
					$vecinos[$v]=$groups[$g][$d];
					$v++;												
				}					
			}
		}	
		
		//aqui tengo que ordenar
		//var_dump($distancias);
		//var_dump($vecinos);
		asort($distancias);
		$vecinos=sortArrayByArray($vecinos, $distancias);
		//var_dump($distancias);
		//var_dump($vecinos);
		$vecinos=array_slice($vecinos,0,$k-1);
		return $vecinos;
			
	}
	
	function kvecinosconsulta($consulta, $groups, $k, $w)
	{
		$vecinos=array();
		$v=0;
		for($i=0;$i<count($groups);$i++)
		{
			$distancias[$i]=distance($consulta, $w[$i]);
		}
		
		$distmin=1000;
		for($d=0;$d<count($groups);$d++)
		{
			$dist=distance($consulta, $groups[$d]);
			if(($dist<$distmin)&&(!in_array($groups[$d], $vecinos)))
			{
				$distmin=$dist;
				$vecinos[$v]=$groups[$d];
				$v++;												
			}					
		}
		
		//aqui tengo que ordenar
		//var_dump($distancias);
		//var_dump($vecinos);
		asort($distancias);
		$vecinos=sortArrayByArray($vecinos, $distancias);
		//var_dump($distancias);
		//var_dump($vecinos);
		//$vecinos=array_slice($vecinos,0,$k-1);
		return $vecinos;
			
	}
	
	function clconsulta($consulta, $vecinos, $groups)
	{
		$cgroups=array_fill(0,count($groups),0);
		for($i=0;$i<count($groups);$i++)
		{
			$cgroups[$i]=0;
			for($v=0;$v<count($vecinos);$v++)
			{
				if(in_array($vecinos[$v],$groups[$i]))
				{
					$cgroups[$i]++;
				}
			}
		}
		return array_search(max($cgroups),$cgroups);
	}
	
	function rnurl($vecinos,$matriz)
	{
		$can=array();
		for($i=0;$i<count($vecinos);$i++)
		{
			$can[$i]=array_search($vecinos[$i], $matriz);
		}
		return $can;
	}

	function sortArrayByArray($array,$orderArray) 
	{
    $ordered = array();
    $orderArray=array_keys($orderArray);
    $k=0;
    foreach($orderArray as $key) 
    {
        if(array_key_exists($key,$array)) 
        {
                $ordered[$k] = $array[$key];
                $k++;                
        }
    }
    return $ordered;
	}	

?>
